home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / math / elefunt / tsinh.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  7.5 KB  |  327 lines

  1. /* -*-C-*- tsinh.c */
  2.  
  3. #include "elefunt.h"
  4.  
  5. /*#     program to test sinh/cosh
  6. #
  7. #     data required
  8. #
  9. #        none
  10. #
  11. #     subprograms required from this package
  12. #
  13. #        machar - an environmental inquiry program providing
  14. #                 information on the floating-point arithmetic
  15. #                 system.  note that the call to machar can
  16. #                 be deleted provided the following six
  17. #                 parameters are assigned the values indicated
  18. #
  19. #                 ibeta  - the radix of the floating-point system
  20. #                 it     - the number of base-ibeta digits in the
  21. #                          significand of a floating-point number
  22. #                 irnd   - 0 if floating-point addition chops,
  23. #                          1 if floating-point addition rounds
  24. #                 minexp - the largest in magnitude negative
  25. #                          integer such that float(ibeta)**minexp
  26. #                          is a positive floating-point number
  27. #                 eps    - the smallest positive floating-point
  28. #                          number such that 1.0+eps != 1.0
  29. #                 xmax   - the largest finite floating-point no.
  30. #
  31. #        ran(k) - a function subprogram returning random real
  32. #                 numbers uniformly distributed over (0,1)
  33. #
  34. #
  35. #     standard fortran subprograms required
  36. #
  37. #         abs, alog, amax1, cosh, float, int, sinh, sqrt
  38. #
  39. #
  40. #     latest revision - december 6, 1979
  41. #
  42. #     author - w. j. cody
  43. #              argonne national laboratory
  44. #
  45. #*/
  46.  
  47. void
  48. tsinh()
  49. {
  50.     int i,
  51.         ibeta,
  52.         iexp,
  53.         ii,
  54.         irnd,
  55.         it,
  56.         i1,
  57.         i2,
  58.         j,
  59.         k1,
  60.         k2,
  61.         k3,
  62.         machep,
  63.         maxexp,
  64.         minexp,
  65.         n,
  66.         negep,
  67.         ngrd,
  68.         nit;
  69.     float a,
  70.         aind,
  71.         ait,
  72.         albeta,
  73.         alxmax,
  74.         b,
  75.         beta,
  76.         betap,
  77.         c,
  78.         c0,
  79.         del,
  80.         den,
  81.         eps,
  82.         epsneg,
  83.         five,
  84.         r6,
  85.         r7,
  86.         three,
  87.         w,
  88.         x,
  89.         xl,
  90.         xmax,
  91.         xmin,
  92.         xn,
  93.         x1,
  94.         xsq,
  95.         y,
  96.         z,
  97.         zz;
  98.  
  99.     machar(&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
  100.         &maxexp, &eps, &epsneg, &xmin, &xmax);
  101.     beta = (float) ibeta;
  102.     albeta = ALOG(beta);
  103.     alxmax = ALOG(xmax);
  104.     ait = (float) it;
  105.     three = 3.0e0L;
  106.     five = 5.0e0L;
  107.     c0 = five / 16.0e0L + 1.152713683194269979e-2L;
  108.     a = ZERO;
  109.     b = 0.5e0L;
  110.     c = (ait + ONE) * 0.35e0L;
  111.     if (ibeta == 10)
  112.     c = c * three;
  113.     n = 2000;
  114.     xn = (float) n;
  115.     i1 = 0;
  116.     i2 = 2;
  117.     nit = 2 - (INT(ALOG(eps) * three)) / 20;
  118.     aind = (float) nit + nit + 1;
  119.  
  120.     /* random argument accuracy tests */
  121.  
  122.     for (j = 1; j <= 4; ++j)
  123.     {
  124.     if (j == 2)
  125.     {
  126.         aind = aind - ONE;
  127.         i2 = 1;
  128.     }
  129.     k1 = 0;
  130.     k3 = 0;
  131.     x1 = ZERO;
  132.     r6 = ZERO;
  133.     r7 = ZERO;
  134.     del = (b - a) / xn;
  135.     xl = a;
  136.  
  137.     for (i = 1; i <= n; ++i)
  138.     {
  139.         x = del * ran(i1) + xl;
  140.         if (j > 2)
  141.         {
  142.         y = x;
  143.         x = y - ONE;
  144.         w = x - ONE;
  145.         if (j == 4)
  146.         {
  147.             z = cosh(x);
  148.             zz = (cosh(y) + cosh(w)) * c0;
  149.         }
  150.         else
  151.         {
  152.             z = sinh(x);
  153.             zz = (sinh(y) + sinh(w)) * c0;
  154.         }
  155.         }
  156.         else
  157.         {
  158.         xsq = x * x;
  159.         zz = ONE;
  160.         den = aind;
  161. #
  162.         for (ii = i2; ii <= nit; ++ii)
  163.         {
  164.             w = zz * xsq / (den * (den - ONE));
  165.             zz = w + ONE;
  166.             den = den - 2.0e0L;
  167.         }
  168. #
  169.         if (j == 2)
  170.         {
  171.             z = cosh(x);
  172.             if (irnd == 0)
  173.             {
  174.             w = (ONE - zz) + w;
  175.             zz = zz + (w + w);
  176.             }
  177.         }
  178.         else
  179.         {
  180.             w = x * xsq * zz / 6.0e0L;
  181.             zz = x + w;
  182.             z = sinh(x);
  183.             if (irnd == 0)
  184.             {
  185.             w = (x - zz) + w;
  186.             zz = zz + (w + w);
  187.             }
  188.         }
  189.         }
  190.         w = ONE;
  191.         if (z != ZERO)
  192.         w = (z - zz) / z;
  193.         if (w > ZERO)
  194.         k1 = k1 + 1;
  195.         if (w < ZERO)
  196.         k3 = k3 + 1;
  197.         w = ABS(w);
  198.         if (w > r6)
  199.         {
  200.         r6 = w;
  201.         x1 = x;
  202.         }
  203.         r7 = r7 + w * w;
  204.         xl = xl + del;
  205.     }
  206.  
  207.     k2 = n - k3 - k1;
  208.     r7 = sqrt(r7 / xn);
  209.     i = (j / 2) * 2;
  210.     if (j == 1)
  211.         printf("\fTEST OF SINH(X) VS T.S. EXPANSION OF SINH(X)\n\n");
  212.     else if (j == 2)
  213.         printf("\fTEST OF COSH(X) VS T.S. EXPANSION OF COSH(X)\n\n");
  214.     else if (j == 3)
  215.         printf("\fTEST OF SINH(X) VS C*(SINH(X+1)+SINH(X-1))\n\n");
  216.     else if (j == 4)
  217.         printf("\fTEST OF COSH(X) VS C*(COSH(X+1)+COSH(X-1))\n\n");
  218.     printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n", n);
  219.     printf("      (" F15P4E "," F15P4E ")\n\n\n", a, b);
  220.     if (i != j)
  221.     {
  222.         printf(" SINH(X) WAS LARGER%6d TIMES,\n", k1);
  223.         printf("             AGREED%6d TIMES, AND\n", k2);
  224.         printf("        WAS SMALLER%6d TIMES.\n\n\n", k3);
  225.     }
  226.     else
  227.     {
  228.         printf(" COSH(X) WAS LARGER%6d TIMES,\n", k1);
  229.         printf("             AGREED%6d TIMES, AND\n", k2);
  230.         printf("        WAS SMALLER%6d TIMES.\n\n\n", k3);
  231.     }
  232.     printf(
  233. " THERE ARE%4d BASE%4d SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER\n\n\n",
  234.         it, ibeta);
  235.     w = -999.0e0;
  236.     if (r6 != ZERO)
  237.         w = ALOG(ABS(r6)) / albeta;
  238.     printf(" THE MAXIMUM RELATIVE ERROR OF" F15P4E " = %4d **" F7P2F "\n",
  239.         r6, ibeta, w);
  240.     printf("    OCCURRED FOR X =" F17P6E "\n", x1);
  241.     w = AMAX1(ait + w, ZERO);
  242.     printf(
  243.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  244.         ibeta, w);
  245.     w = -999.0e0;
  246.     if (r7 != ZERO)
  247.         w = ALOG(ABS(r7)) / albeta;    /* */
  248.     printf(" THE ROOT MEAN SQUARE RELATIVE ERROR WAS" F15P4E " = %4d **" F7P2F "\n",
  249.         r7, ibeta, w);
  250.     w = AMAX1(ait + w, ZERO);
  251.     printf(
  252.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  253.         ibeta, w);
  254.     if (j == 2)
  255.     {
  256.         b = alxmax;
  257.         a = three;
  258.     }
  259.     }
  260.  
  261.     /* special tests */
  262.  
  263.     printf("\fSPECIAL TESTS\n\n");
  264.     printf(" THE IDENTITY  SINH(-X) = -SINH(X)  WILL BE TESTED.\n\n");
  265.     printf("        X            F(X) + F(-X)\n\n");
  266.  
  267.     for (i = 1; i <= 5; ++i)
  268.     {
  269.     x = ran(i1) * a;
  270.     z = sinh(x) + sinh(-x);
  271.     printf(F15P7E F15P7E "\n\n", x, z);
  272.     }
  273.  
  274.     printf(" THE IDENTITY SINH(X) = X , X SMALL, WILL BE TESTED.\n\n");
  275.     printf("        X         X - F(X)\n\n");
  276.     betap = ipow(beta, it);
  277.     x = ran(i1) / betap;
  278.  
  279.     for (i = 1; i <= 5; ++i)
  280.     {
  281.     z = x - sinh(x);
  282.     printf(F15P7E F15P7E "\n\n", x, z);
  283.     x = x / beta;
  284.     }
  285.  
  286.     printf(" THE IDENTITY  COSH(-X) = COSH(X)  WILL BE TESTED.\n\n");
  287.     printf("        X         F(X) - F(-X)\n\n");
  288.  
  289.     for (i = 1; i <= 5; ++i)
  290.     {
  291.     x = ran(i1) * a;
  292.     z = cosh(x) - cosh(-x);
  293.     printf(F15P7E F15P7E "\n\n", x, z);
  294.     }
  295.  
  296.     printf(" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT.\n\n");
  297.     x = pow((float) beta, (float) (FLOAT(minexp) * 0.75e0));
  298.     y = sinh(x);
  299.     printf("      SINH(" F13P6E ") =" F13P6E "\n\n", x, y);
  300.  
  301.     /* test of error returns */
  302.  
  303.     printf("\fTEST OF ERROR RETURNS\n\n\n");
  304.  
  305.     x = alxmax + 0.125e0L;
  306.     printf(" SINH WILL BE CALLED WITH THE ARGUMENT" F15P4E "\n", x);
  307.     printf(" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE\n\n\n");
  308.     fflush(stdout);
  309.     errno = 0;
  310.     y = sinh(x);
  311.     if (errno)
  312.     perror("sinh()");
  313.     printf(" SINH RETURNED THE VALUE" F15P4E "\n\n\n", y);
  314.  
  315.     x = betap;
  316.     printf("\nSINH WILL BE CALLED WITH THE ARGUMENT" F15P4E "\n",x);
  317.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  318.     fflush(stdout);
  319.     errno = 0;
  320.     y = sinh(x);
  321.     if (errno)
  322.     perror("sinh()");
  323.     printf(" SINH RETURNED THE VALUE" F15P4E "\n\n\n\n", y);
  324.  
  325.     printf(" THIS CONCLUDES THE TESTS\n\n");
  326. }
  327.